package com.copm.ifm.base.service.mp.page;

import com.copm.ifm.base.api.pojo.PageDTO;
import com.copm.ifm.base.api.pojo.PageVO;
import io.netty.util.concurrent.FastThreadLocal;

import java.util.List;
import java.util.function.Function;

/**
 * 分页处理类
 *
 * @author zzf
 * @date 2020/7/3 9:56
 */
public class PageProxy {

    /**
     * 当前线程共享对象，用于分页拦截器获取参数并返回
     */
    public static final FastThreadLocal<PageVO<?>> LOCAL_PAGE = new FastThreadLocal<>();

    /**
     * 分页方法增强，获取分页信息
     *
     * @param selectForPage BaseMapper的查询Page方法
     * @param pageDTO       分页接口参数对象
     * @param <P>           分页接口筛选参数对象
     * @param <R>           分页接口返回对象
     */
    public static <P, R> PageVO<R> proxy(Function<P, List<R>> selectForPage, PageDTO<P> pageDTO) {
        PageVO<R> pageVO = new PageVO<>(pageDTO);
        try {
            LOCAL_PAGE.set(pageVO);
            pageVO.setRecords(selectForPage.apply(pageDTO.getParam()));
        } finally {
            LOCAL_PAGE.remove();
        }
        return pageVO;
    }
}
